package logs

import (
	"time"

	"gitee.com/xgotool/sqlite-logs-more/model"
	"gitee.com/xgotool/sqlite-logs-more/service/rootdb"
	"gitee.com/xiaoyutab/xgotool/optional/xcache"
	"gitee.com/xiaoyutab/xgotool/xnum"
	"gorm.io/gorm"
)

// 获取设备的所有应用列表
//
//	id	设备列表
func AllDerviceApp(id int64) ([]string, error) {
	aps := []string{}
	cache_key := xcache.Key("service.logs.all.dervice.app", id)
	if xcache.Exists(cache_key) {
		if err := xcache.GetStruct(cache_key, &aps); err == nil {
			return aps, nil
		}
		aps = []string{}
	}
	files, err := rootdb.FileListAll(0, 0)
	if err != nil {
		return nil, err
	}
	for i := 0; i < len(files); i++ {
		db, err := connect_file(files[i].Path)
		if err != nil {
			continue
		}
		apps := getApps(db, id)
		for j := 0; j < len(apps); j++ {
			if !xnum.InArray(apps[j], aps) {
				aps = append(aps, apps[j])
			}
		}
	}
	// 写入缓存【此处存储5分钟，不与整体的缓存时长做对比】
	xcache.SetStructExt(cache_key, aps, time.Minute*5)
	return aps, nil
}

// 获取数据库中的表列表
func getApps(db *gorm.DB, did int64) []string {
	if db == nil {
		return nil
	}
	aps := []string{}
	table := []string{
		model.AppLog{}.TableName(),
		model.PipeLog{}.TableName(),
		model.QuestLog{}.TableName(),
		model.QuestLog{}.TableName(),
	}
	for i := 0; i < len(table); i++ {
		tmp_apps := []string{}
		// 设备都是存储的did，应用都是存储的args，所以此处可以直接这么使用
		db.Table(table[i]).Where("did", did).Select("args").Group("args").Find(&tmp_apps)
		for j := 0; j < len(tmp_apps); j++ {
			if !xnum.InArray(tmp_apps[j], aps) {
				aps = append(aps, tmp_apps[j])
			}
		}
	}
	return aps
}
